1 ' $TITLE: 'Revised PC-TALK 3, Ver 3.65, Level 840517, 5/17/84' $SUBTITLE: 'Compile /O/E/S/C:4096.LINK:.OBJ's IBMCOM+CHDIR+GETDIR+DSK' if you optimize the basic pgm, use /N & omit /S)
2 ' by Jim Gainsley, Mpls MN 55401 (612)338-6124 (CompuServe 70346,457), which besides the work of the author, incorporates the work of John Chapmen, Wes Meier, & Jack Wright, & one unknown author. (See .DOC) -- 5/17/84
3 ' WARNING! DO NOT USE THIS PROGRAM: 1) IF YOU DO NOT HAVE THE BASIC COMPILER 2) UNTIL YOU HAVE READ PCT365.DOC. 3) UNTIL YOU HAVE OBTAINED THE .OBJ FILES MENTIONED ABOVE (IBMCOM IS A PART OF THE COMPILER PACKAGE). 4) IF
4 ' YOUR MEMORY IS NOT AT LEAST 128K.
5 ' THIS VERSION INCLUDES CHANGES MADE BY GENE PLANTZ IN MARCH, 1984
6 ' This version includes ALT-B "Silent Mode" and fixes by Bob Mahoney, August, 1984
647 IF FF=0 THEN GOTO 655 ELSE GOSUB 12000:ESC=0:C$="":GOTO 655
650 PRINT Z$;
655 NEXT I
660 IF SP THEN ROW=CSRLIN:COL=POS(0):LOCATE 25,XPOS,1
661 IF PR THEN PR$=PR$+A$:GOSUB 800
700 ' -- Check Status
705 IF SET THEN 715
710 B$=INKEY$:IF B$<>"" THEN 525
715 IF LOC(1)>0 THEN 605
720 IF PSE THEN PSE=0:PRINT#1,XN$;
725 IF SET THEN ROW=CSRLIN:COL=POS(0):GOTO 1000
730 GOTO 515
800 ' -- Printer buffer
805 P=INSTR(PR$,BS$):IF P=0 THEN 810 ELSE IF LEN(PR$)>1 THEN PR$=LEFT$(PR$,P-2)+RIGHT$(PR$,LEN(PR$)-P):GOTO 805
810 P=INSTR(PR$,CR$):IF P=0 THEN 815 ELSE PRINT#3,LEFT$(PR$,P);:PR$=RIGHT$(PR$,LEN(PR$)-P):GOTO 810
815 IF LEN(PR$)>220 THEN PRINT#3,PR$;:PR$="":RETURN
820 RETURN
825 '
1000 ' ***** ALT-KEY INPUT *****
1005 '
1010 IF ALTSET THEN LOCATE 25,17 ELSE LOCATE 25,15+LEN(ALT$)
1015 C$=INKEY$:IF C$="" THEN IF EOF(1) THEN 1015 ELSE SET=-1:LOCATE ROW,COL:GOTO 605
1020 IF NOT ALTSET THEN 1035
1025 LOCATE 25,19:IF ASC(C$)>=49 AND ASC(C$)<=57 THEN ALTKY=ASC(C$)-48ELSE IF ASC(C$)=48 THEN ALTKY=10 ELSE GOSUB 50500:GOTO 1010
1030 IF ALTSET THEN ALTSET=0:SET=-1:LOCATE 25,1:PRINT STRING$(5,16);" Alt-";ALTKY;CHR$(198);" ";CHR$(181);:GOTO 1010
1035 IF LEN(ALT$)>=51 THEN ALT$=LEFT$(ALT$,49):LOCATE 25,64:PRINT" ";CHR$(181);:LOCATE 25,66:GOSUB 50500:PRINT"(max 50 chrs.)";:GOTO 1010
1040 IF C$=BS$ THEN IF ALT$="" GOTO 1010 ELSE GOSUB 2650:ALT$=LEFT$(ALT$,LEN(ALT$)-1):GOTO 1010
1045 IF C$=CHR$(13) THEN 1070
1050 IF C$>CHR$(31) THEN PRINT C$; ELSE COLOR HI,BG:PRINT CHR$(ASC(C$)+64);:COLOR FG,BG
1055 PRINT" ";CHR$(181);
1060 IF C$=XCR$ THEN C$=CHR$(13)
1065 ALT$=ALT$+C$:GOTO 1010
1070 IF ALT$<>"" THEN IF ALT$=" " THEN ALT$(ALTKY)="" ELSE ALT$(ALTKY)=ALT$
1075 ALT$="":SET=0:GOTO 1200
1080 '
1200 ' ***** ALT-KEY DISPLAY *****
1205 '
1210 P=1:FOR I=1 TO 10:LOCATE 25,P:IF I=10 THEN PRINT"0";:COLOR BG,FG:GOTO 1220
1215 PRINT USING "#";I;:COLOR BG,FG
1220 FOR J=1 TO 7:Z$=MID$(ALT$(I),J,1):IF POS(0)=80 THEN 1235
1225 IF J>LEN(ALT$(I)) THEN PRINT" ";:GOTO 1235
1230 IF Z$>=" "THEN PRINT Z$; ELSE IF Z$=CR$ THEN PRINT XCR$; ELSE COLOR HI,FG:PRINT CHR$(ASC(Z$)+64);:COLOR BG,FG
1235 NEXT J:COLOR FG,BG:P=P+8:NEXT I
1240 FOR I=1 TO 10:IF ALT$(I)<>"" THEN EXIT=-1
1245 NEXT:IF EXIT THEN EXIT=0:LOCATE ROW,COL:GOTO 605
1250 LOCATE ROW,COL:GOSUB 2820:GOTO 515
1255 '
1500 ' ********** E X T E N D E D C O D E S **********
1505 '
1510 EX=0:ROW=CSRLIN:COL=POS(0)
1515 IF LEN(B$)=2 THEN EX=ASC(MID$(B$,2,1)) ELSE EX=0
1516 IF NOT IB THEN 1530
1517 '
1518 IF EX=71 THEN B$=CHR$(127):GOTO 535
1519 IF EX=72 THEN B$=CHR$(27)+CHR$(65):GOTO 535
1520 IF EX=73 THEN B$=CHR$(27)+CHR$(75):GOTO 535
1521 IF EX=75 THEN B$=CHR$(27)+CHR$(68):GOTO 535
1522 IF EX=77 THEN B$=CHR$(27)+CHR$(67):GOTO 535
1523 IF EX=79 THEN B$=CHR$(27)+CHR$(73):GOTO 535
1524 IF EX=80 THEN B$=CHR$(27)+CHR$(66):GOTO 535
1525 IF EX=81 THEN B$=CHR$(23):GOTO 535
1526 IF EX=82 THEN B$=CHR$(22):GOTO 535
1527 IF EX=83 THEN B$=CHR$(127):GOTO 535
1528 IF EX=15 THEN B$=CHR$(7):GOTO 535
1530 IF EX=75 THEN B$=CHR$(29):GOTO 535
1531 IF EX=35 THEN 1850
1532 IF EX=77 THEN B$=CHR$(28):GOTO 535
1533 IF EX=71 THEN 2000
1535 IF EX=19 OR EX=81 THEN EX=19:GOTO 3000
1540 IF EX=47 THEN 3400
1545 IF EX=20 OR EX=73 THEN EX=20:GOTO 3200
1549 ' -- Parms/Dialing/Function key setting
1550 IF EX=25 THEN 5000
1555 IF EX=32 THEN 6000
1560 IF EX=36 OR EX=37 THEN 7000
1565 ' -- Function-Keys/Alt-Keys
1570 IF EX>=59 AND EX<=68 THEN B$=K$(EX-58):GOTO 535
1575 IF EX>=104 AND EX<=113 THEN B$=K$(EX-93):GOTO 535
1580 IF EX>=84 AND EX<=103 THEN B$=K$(EX-63):GOTO 535
1585 IF EX>=120 AND EX<=129 THEN B$=ALT$(EX-119):GOTO 535
1590 IF EX=15 THEN:GOSUB 50500:LOCATE 25,1:PRINT" set Alt-(1-0): ";CHR$(181);:ALTSET= -1:GOTO 1000 'Shft-TB Used in place of 131. Prokey uses Alt-= Shft-Tab was used to read level #, now a part of Start-up Screen -- Jim Gainsley
1595 ' -- Echo/Message/Print
1600 IF EX=18 THEN GOSUB 50500:PRINT:IF ECH=0 THEN ECH=-1:PRINT"===ECHO ON===":GOTO 515 ELSE ECH=0:PRINT"===ECHO OFF===":GOTO 515
1605 IF EX=50 THEN GOSUB 50500:PRINT:IF MSG=0 THEN MSG=-1:PRINT"===MESSAGES ON===":GOTO 515 ELSE MSG=0:PRINT"===MESSAGES OFF===":GOTO 515
1610 IF EX=114 OR EX=132 THEN GOSUB 50500:PRINT:IF PR=0 THEN PR=-1:PRINT"===PRINTOUT ON===":CLOSE#3:OPEN PRNTPORT$ AS #3:PRINT#3,PRNTINIT$;:GOTO 515 ELSE PR=0:CLOSE#3:PRINT"===PRINTOUT OFF===":GOSUB 2715:GOTO 515
1625 IF EX=16 THEN IF DIAL$<>"" THEN 8000 ELSE GOSUB 50500:PRINT"(nothing to redial)":PRINT GO$:GOTO 515
1630 IF EX=31 THEN 3800
1635 IF EX=33 THEN 5200
1640 IF EX=45 THEN GOSUB 50500:CLS:PRINT"===EXIT TO DOS===":PRINT:PRINT"WARNING! If you proceed you will terminate the program.":PRINT"Do you want to do this (y/n)?";
1642 IF EX=45 THEN Q$=INPUT$(1):GOSUB 2555:IF Q$="N" THEN PRINT:PRINT GO$:GOTO 515 ELSE IF Q$="Y" THEN 8915 ELSE 1640
1650 IF EX=38 THEN GOSUB 50500:PRINT:PRINT"===SPECIFY LOGGED DRIVE===":PRINT"Current default for file specs: ";DRIV$:PRINT"New default: ";:QL=2:GOSUB 2500:IF Q$="" THEN PRINT:PRINT GO$:GOTO 515 ELSE DRIV$=LEFT$(Q$,1)+":":PRINT:PRINT GO$:GOTO 515
1655 IF EX=21 THEN 3900
1660 IF EX=46 THEN PRINT CHR$(12):GOSUB 2800:GOTO 515
1665 IF EX=17 THEN GOSUB 50500:PRINT"===SPECIFY WIDTH ALARM===":PRINT"Current setting for right margin:";MARG:PRINT"New setting: ";:QL=3:GOSUB 2500:IF Q$="" THEN PRINT:PRINT GO$:GOTO 515 ELSE MARG=VAL(Q$):PRINT:PRINT GO$:GOTO 515
1670 IF EX=117 THEN OLDVAL=INP(LCR):BRKVAL=OLDVAL OR 64:OUT LCR,BRKVAL:SOUND SD,3:SOUND SD,1:OUT LCR,OLDVAL:GOTO 515
1675 ' (Shft-Tab (EX=15) now used for Alt-1/0 Temp Keys)
1680 '
1681 ' -- More Extended Codes can go here (see p.G-6 IBM BASIC manual)
1682 IF EX=119 THEN 10000
1685 '
1690 '
1691 ' -- CHDIR/Insert Alt-1-0/Save Alt-1-0/ALT COMM PORT/Keyboard pacing
1692 IF EX=34 THEN GOTO 11100
1693 IF EX=23 THEN GOTO 11130
1694 IF EX=22 THEN GOTO 11160
1695 IF EX=30 THEN GOTO 515 'Not implemented
1696 IF EX=24 THEN GOTO 13000 'I.B.M. 3101 Operation
1697 IF EX=48 THEN GOTO 60000 'Silent mode toggle
1699 GOTO 515 'DON'T remove this line! (failsafe to return to terminal)
1847 '
1848 ' ***** HANGUP AFTER CONNECT (Hayes) -- Jim Gainsley (612)338-6124
1849 '
1850 IF NOT EOF(1) THEN Q$=INPUT$(LOC(1),#1):Q$="" ELSE Q$="" 'Purge buffer
1851 SFRE=900:SLEN=2:GOSUB 50000:CLOSE #1:OPEN COMM$ AS #1:SOUND SD,10:PRINT #1,MODMINIT$:SOUND SD,10:PRINT #1,"ATH0":SOUND SD,25:IF LOC(1)>0 THEN Q$=INPUT$(LOC(1),1):IF INSTR(Q$,"OK") THEN GOTO 1895
1855 PRINT #1,"+++";:SOUND SD,30
1860 IF LOC(1)>0 THEN Q$=INPUT$(LOC(1),1) ELSE GOTO 1890
1865 IF INSTR(Q$,"OK")<>0 THEN Q$="":GOTO 1870 ELSE GOTO 1890
1870 PRINT #1,"ATH0":SOUND SD,30:Q1=0
1875 IF LOC(1)>0 THEN Q$=INPUT$(LOC(1),1)
1880 IF INSTR(Q$,"OK")<>0 OR INSTR(Q$,"NO CARRIER")<>0 THEN Q$="":GOTO 1895 ELSE PRINT"2nd PHASE FAILURE . . ."
1885 IF Q1<4 AND INSTR(Q$,"NO CARRIER")=0 GOTO 1870
1890 Q1=Q1+1: IF INSTR(Q$,"NO CARRIER")<>0 GOTO 1895 ELSE IF Q1<4 THEN PRINT "1rst PHASE FAILURE . . . I'M RETRYING . . .":GOTO 1850 ELSE GOSUB 1900:GOTO 1895
1895 Q1=0:CLOSE#1:OPEN COMM$ AS #1:SFRE=500:SLEN=1:GOSUB 50000:SOUND SD,1:GOSUB 50000:PRINT:PRINT GO$:GOTO 515
1900 COLOR HI,BG:PRINT "I HAVEN'T RECEIVED HANGUP VERIFICATION AFTER 4 TRIES": COLOR FG,BG:PRINT"Check Modem CD lite. If lit, try ALT-H again.":RETURN
3010 IF RC THEN RC=0:RC$="":GOSUB 50500:PRINT:PRINT"===RECEIPT OF FILE ";RCV$; " TERMINATED===":GOSUB 3247:PRINT:GOSUB 2700:GOSUB 2800:IF MSG THEN PRINT#1,BL$;CR$;"===FILE RECEIVED===":GOTO 515 ELSE 515
3015 RC$="":GOSUB 50500:PRINT:PRINT"===RECEIVE A FILE===":DRV$=DRIV$:GOSUB 3110:GOTO 3500
3020 IF RC$="X" THEN CLOSE#2:KILL RCV$:OPEN RCV$ AS #2 LEN=128:FIELD #2,128 AS X$:GOTO 3030
3025 IF MSG THEN PRINT#1,BL$;CR$;"===READY TO RECEIVE===
3030 MSG$=" Receiving "+RCVX$+" (ALT-R or PgDn to Terminate)":GOSUB 2600
3035 RC=-1:IF RC$="X" THEN 4500 ELSE 605
3040 '
3107 ' ***** FIND FREE DISK SPACE WITH Alt-V -- Jack Wright *****
3108 ' -- Calls to DSK.OBJ
3109 '
3110 A=2:B=0:C!=0:IF DRV$="A:" OR DRV$="a:" THEN A=1
3115 IF DRV$="C:" OR DRV$="c:" THEN A=3
3116 IF DRV$="D:" OR DRV$="d:" THEN A=4
3117 IF DRV$="E:" OR DRV$="e:" THEN A=5
3118 IF DRV$="F:" OR DRV$="f:" THEN A=6
3132 NAME DRV$+"1" AS DRV$+"1" 'make sure disk is in drive
3135 CALL DSK(A,B):C!=(C!+B)*512 'see p. 110, compiler manual
3140 PRINT DRV$;" Drive Free Space = ";C!
3145 RETURN
3200 ' ***** TRANSMIT A FILE *****
3205 '
3210 IF TR THEN TR=0:TR$="":MSG1$="===TRANSMISSION OF FILE ":MSG2$= " TERMINATED===":GOSUB 3247:GOSUB 50500:PRINT:PRINT MSG1$;TRN$;MSG2$:GOSUB 2715: GOSUB 2800:IF MSG THEN PRINT#1,CR$;MSG1$;MSG2$,BL$:GOTO 515 ELSE 515
3215 IF TR THEN TR=0:TR$="":MSG1$="===END OF FILE":MSG2$="===":GOSUB 50500:PRINT: GOSUB 3247:PRINT MSG1$;" ";TRN$;MSG2$:GOSUB 2715:GOSUB 2800:IF MSG THEN PRINT#1,"65529 '";MSG1$;MSG2$;BL$:GOTO 515 ELSE 515
3220 TR$="":GOSUB 50500:PRINT:PRINT"===TRANSMIT A FILE===":GOTO 3500
3225 CLOSE#3:OPEN TRN$ AS #3 LEN=128:FIELD #3,128 AS X$
3230 MSG$=" Transmitting "+TRNX$+" (ALT-T or PgUp to Terminate)":IF TR$="X" THEN MSG$=MSG$+" # of blocks:" ELSE IF TR$="P" THEN MSG$=MSG$+" percent remain:" ELSE MSG$=MSG$+" min. remain:"
3235 MSG$=TRMSG$:GOSUB 2600:IF TR$="X" THEN ROW=CSRLIN:COL=POS(0):LOCATE 25,74:CNT!=FIX(LOF(3)/128):FLN!=LOF(3)/128:IF CNT!=FLN! THEN PRINT CNT!;:LOCATE ROW,COL ELSE PRINT CNT!+1;:LOCATE ROW,COL:GOTO 3245
3240 IF MSG THEN PRINT#1,CR$;"0 '===START OF FILE===";BL$
3245 TR=-1:FLN!=LOF(3):IF TR$<>"X" THEN 4000 ELSE 4700
3247 '
3248 GOSUB 40000:RETURN
3250 '
3400 ' ***** VIEW A FILE *****
3401 '
3405 DRV$=DRIV$:GOSUB 3110 'Rem if def. drive free spc isn't wanted ea. time
3410 GOSUB 50500:PRINT:PRINT"===VIEW A FILE===":GOTO 3500
3415 MSG$=" Viewing "+VEWX$+" Press <space> to continue (Alt-V to terminate)" :GOSUB 2600:PRINT:PRINT:PRINT
3420 WHILE NOT EOF(3):FOR I=1 TO 20:LINE INPUT#3,X$:J=LEN(X$):IF J<80 THEN PRINT X$ ELSE PRINT X$;:IF J>80 THEN I=I+FIX(J/80)
3421 IF PR THEN LPRINT X$
3425 NEXT
3430 Q$=INKEY$:IF Q$="" THEN 3430 ELSE IF Q$=" " THEN 3420 ELSE IF Q$=CHR$(0)+CHR$(47) THEN 3445 ELSE GOSUB 50500:GOTO 3430
3435 WEND
3440 GOSUB 50500:PRINT:PRINT"===END OF FILE ";VEW$;" ===":GOTO 3450
3445 GOSUB 50500:PRINT:PRINT"===VIEWING OF FILE ";VEW$;" TERMINATED===
3450 GOSUB 2715:GOSUB 2800:GOTO 515
3455 '
3500 ' ***** FILE SPECS *****
3505 '
3510 EXIT=0:PRINT" specification:";
3515 Q$=INKEY$:IF Q$="" THEN 3515 ELSE IF Q$=CR$ OR Q$=BS$ THEN FIL$="":PRINT:GOTO 3540
3520 IF LEN(Q$)>1 THEN Q=ASC(MID$(Q$,2,1)):IF Q>=59 AND Q<=68 THEN Q$=K$(Q-58) ELSE IF Q>=104 AND Q<=113 THEN Q$=K$(Q-93) ELSE IF Q>=84 AND Q<=103 THEN Q$=K$(Q-63) ELSE IF Q>=120 AND Q<=129 THEN Q$=ALT$(Q-119) ELSE GOSUB 50500:GOTO 3515
3525 IF Q$<>" " THEN PRINT Q$;:QL=128:GOSUB 2510:GOSUB 2555:FIL$=Q$:PRINT:LOCATE,,1:GOTO 3540
3530 IF EX=19 THEN FIL$=RCVX$ ELSE IF EX=20 THEN FIL$=TRNX$ ELSE IF EX=47 THEN FIL$=VEWX$
3810 SFRE=440:SLEN=2:GOSUB 50000:CLOSE#2:OPEN DUMP$ FOR APPEND AS #2:MSG$=" Appending to "+DUMP$+" at "+TIME$:GOSUB 2600
3815 FOR I=1 TO 24:Y$="":FOR J=1 TO 79:X=SCREEN(I,J):Y$=Y$+CHR$(X):NEXT J:PRINT #2,Y$:NEXT I:PRINT#2,STRING$(79,45);CR$;LF$;"*** PC-TALK III SCREENDUMP - " ;DATE$;" at ";TIME$;" ***";CR$;LF$;STRING$(79,61):CLOSE#2
4020 LOCATE 25,74:IF TR$<>"P" THEN PRINT USING"###.#";(FLN!-(CNT!*128))/RATE!; ELSE PRINT USING".##";(FLN!-CNT!*128)/FLN!;
4025 GET#3,CNT!:Y$=X$:LOCATE ROW,COL
4030 IF TR$="P" THEN GOSUB 4400:IF NOT ABORT THEN 4050 ELSE ABORT=0:GOTO 1500
4035 PRINT#1,Y$;:IF TR$="B" THEN 4050
4040 P=INSTR(1,Y$,LF$):IF P=0 THEN 4045 ELSE Y$=LEFT$(Y$,P-1)+RIGHT$(Y$,LEN(Y$)-P):GOTO 4040
4045 FOR I=1 TO 128:PRINT MID$(Y$,I,1);:NEXT
4050 ROW=CSRLIN:COL=POS(0):GOSUB 4070:B$=INKEY$:IF B$="" THEN 4060
4055 IF LEN(B$)>1 THEN 1500
4060 CNT!=CNT!+1:IF CNT!*128<FLN! THEN 4020 ELSE GET#3,CNT!:Y$=X$:GOTO 4200
4065 ' -- XON/XOFF Subroutine
4070 IF EOF(1) THEN 4085 ELSE A$=INPUT$(LOC(1),#1)
4075 P=INSTR(1,A$,XF$):IF P<>0 THEN HLT=-1:COLOR HI,BG:PRINT"<<XOFF>>";:COLOR FG,BG
4080 IF HLT THEN P=INSTR(1,A$,XN$):IF P=0 THEN 4085 ELSE HLT=0:RETURN
4085 IF HLT THEN Q$=INKEY$:IF Q$<>"" THEN IF LEN(Q$)<>2 THEN 4070 ELSE IF ASC(RIGHT$(Q$,1))=24 THEN HLT=0:RETURN ELSE 4070 ELSE 4070
4090 RETURN
4200 ' -- Transmit last block
4205 I=0:CNT!=(CNT!-1)*128
4210 I=I+1:CNT!=CNT!+1:IF I>255 THEN 4230 ELSE Z$=MID$(Y$,I,1)
4215 IF TR$="B" THEN IF CNT!<=FLN! THEN 4235 ELSE 4230
4220 IF Z$<>EF$ THEN 4235 ELSE 4230
4225 IF CNT!<=FLN! THEN 4235
4230 IF EOF(1) THEN 3215 ELSE DMMY$=INPUT$(LOC(1),#1):GOTO 4230
4235 IF TR$="P" THEN IF Z$=LF$ THEN 4210
4240 PRINT#1,Z$;:IF TR$="P" THEN IF Z$=CR$ THEN PRINT Z$;:GOSUB 4425:GOTO 4210
4245 IF TR$="B" OR Z$=LF$ THEN 4210
4250 PRINT Z$;:GOTO 4210
4400 ' -- Line pacing subrout
4405 FOR I=1 TO LEN(Y$):Z$=MID$(Y$,I,1):IF Z$=LF$ THEN 4415 ELSE IF Z$<>CR$ THEN PRINT#1,Z$;:PRINT Z$;:GOTO 4415 ELSE PRINT #1," "+CR$;:PRINT CR$;:B$="":GOSUB 4420
4410 IF ABORT THEN RETURN
4415 NEXT:RETURN
4420 IF LEN(B$)>1 THEN ABORT=-1:RETURN
4425 IF (INP(LSR) AND 96)<>96 THEN 4425
4430 IF DEL!>0 THEN SOUND SD,18*DEL!:SOUND SD,1:RETURN
4435 Z$="":WHILE NOT EOF(1):Z$=Z$+INPUT$(LOC(1),#1):WEND:PRINT Z$;:IF Z$="" THEN Z$=CHR$(0) ELSE IF LEN(Z$)>128 THEN Z$=""
4440 P=INSTR(Z$,PROMPT$):B$=INKEY$:IF P<>0 OR B$=" " THEN RETURN ELSE 4420
4825 CK=0:FOR I=1 TO LEN(Y$):CK=CK+ASC(MID$(Y$,I,1)):NEXT:CK=(CK AND 255)
4830 IF CK>256 THEN CK=CK-256:GOTO 4830
4835 SEC=(255 AND BLK):Y$=SOH$+CHR$(SEC)+CHR$(SEC XOR 255)+Y$+CHR$(CK):RETURN
4840 ' -- Terminate
4845 PRINT#1,EOT$;:PRINT"***Sending End Marker ";:ETT =-1:GOTO 4755
4850 CLOSE #3:GOTO 3215
4855 PRINT:PRINT"***Cancelled by Receiver":CLOSE#3:GOTO 3210
4860 PRINT:PRINT"***Cancelled by Transmitter":CLOSE#3:PRINT#1,CAN$;:GOTO 3210
4865 '
4900 ' XMODEM Subroutines
4905 Z$="":ZA=0
4910 IF NOT EOF(1) THEN Z$=INPUT$(LOC(1),#1):RETURN ELSE SOUND SD,1:ZA=ZA+1
4915 IF ZA>72 THEN RETURN ELSE 4910
4920 ' -- Hold for SOH
4925 ABORT=0:SECZ=0:GOSUB 4985
4930 GOSUB 4905:GOSUB 4965:IF ABORT THEN RETURN
4935 IF LEFT$(Z$,1)=SOH$ THEN RETURN
4940 IF LEFT$(Z$,1)=EOT$ THEN RETURN
4945 IF LEFT$(Z$,1)=CAN$ THEN RETURN
4950 GOSUB 4975:PRINT#1,NAK$;
4955 GOSUB 4990:IF NOT TENSEC THEN 4955 ELSE GOSUB 4995:GOTO 4930
4960 ' -- Test for Abort
4965 B$=INKEY$:IF LEN(B$)<2 THEN RETURN ELSE Q$=MID$(B$,2,1):IF Q$=CHR$(19) OR Q$=CHR$(20) OR Q$=CHR$(73) OR Q$=CHR$(81) THEN ABORT=-1:RETURN ELSE RETURN
4970 ' -- Purge Buffer
4975 WHILE NOT EOF(1):Z$=INPUT$(LOC(1),#1):WEND:RETURN
5095 IF MDFLG THEN RETURN ELSE PRINT GO$:GOSUB 2800:GOTO 515
5100 COLOR BG,FG:PRINT MID$(COMM$,6,10);:COLOR FG,BG:PRINT:PRINT
5105 PRINT"Echo-";:IF ECH=-1 THEN PRINT"Y"; ELSE PRINT"N";
5110 PRINT" Mesg-";:IF MSG=-1 THEN PRINT"Y"; ELSE PRINT"N";
5115 PRINT" Strip-";:IF NS=0 THEN PRINT"N"; ELSE PRINT USING"#";NS;
5120 PRINT" Pace-";:IF PC$="" THEN PRINT"N" ELSE PRINT PC$
5125 IF NS=0 THEN PRINT:RETURN ELSE FOR I=1 TO NS:PRINT"Strip #";:PRINT USING"#";I;:PRINT" - /";:PRINT USING"###";ASC(S$(I));:PRINT"/";:IF R$(I)="" THEN PRINT"000"; ELSE PRINT USING"###";ASC(R$(I));
5130 PRINT"/":NEXT:PRINT:RETURN
5135 '
5200 ' ***** NEW DEFAULTS *****
5205 '
5210 CLS:GOSUB 50500:PRINT"===SET NEW DEFAULTS===":PRINT:COLOR BG,FG:PRINT" Present program defaults:";SPACE$(53);:COLOR FG,BG:EXIT=0
5215 FOR I=1 TO DFNUM:J=I+4:P=1:IF I>15 THEN J=I-11:P=32
5220 LOCATE J,P,0:PRINT DP$(I);:LOCATE J,P+16:IF D$(I)>=" " THEN PRINT D$(I); ELSE IF D$(I)="" THEN PRINT "''"; ELSE IF D$(I)=CHR$(0) THEN PRINT "0"; ELSE COLOR HI,BG:PRINT CHR$(ASC(D$(I))+64);:COLOR FG,BG
5225 IF I<15 THEN PRINT SPACE$(12-LEN(D$(I))); ELSE PRINT SPACE$(30-LEN(D$(I)));
5230 NEXT:LOCATE ,,1:IF EXIT THEN 5280 ELSE FOR I=1 TO DFNUM:DT$(I)=D$(I):NEXT
5231 '
5235 LOCATE 21,1:COLOR BG,FG:PRINT" Enter ";ENT$;" to leave unchanged - <space>";ENT$;" for 'null' value - <ESC>";ENT$;" to quit ":COLOR FG,BG
5240 PRINT"*** Enter new values":ABORT=0:FOR I=1 TO DFNUM:J=I+4:P=1:IF I>15 THEN J=I-11:P=32
5245 IF ABORT THEN 5265
5250 IF D$(I)<>"" THEN LOCATE J,P+17+LEN(D$(I)) ELSE LOCATE J,P+19
5255 IF I>15 THEN QL=16 ELSE QL=4
5260 GOSUB 2500:IF Q$=CHR$(27) THEN GOSUB 2655:GOSUB 2655:ABORT=-1 ELSE IF Q$<>"" THEN DT$(I)=Q$:IF DT$(I)=" " THEN DT$(I)=""
5265 NEXT
5270 GOSUB 5295:PRINT"*** New values ok (y/n)?";:Q$=INPUT$(1):PRINT Q$:GOSUB 2555:IF Q$="N" THEN GOSUB 5295:LOCATE 21,1:PRINT SPACE$(79);:LOCATE 21,1:PRINT"(Default Routine Cancelled)":GOTO 5290 ELSE FOR I=1 TO DFNUM:D$(I)= DT$(I):NEXT
5271 '
5275 EXIT=-1:GOSUB 5295:PRINT"*** Make these changes permanent (y/n)?";:Q$=INPUT$(1):PRINT Q$+" ...wait";:GOSUB 2555:IF Q$="Y" THEN GOSUB 5440:GOTO 5215 ELSE GOSUB 5600:GOTO 5215
6235 FOR I=0 TO NS-1:P=VAL(MID$(C$,I*8+1,3)):IF P>255 THEN P=0
6240 J=VAL(MID$(C$,I*8+5,3)):IF J>255 THEN J=0
6245 S$(I+1)=CHR$(P):IF J=0 THEN R$(I+1)="" ELSE R$(I+1)=CHR$(J)
6250 NEXT
6255 IF CVI(G$)<>0 THEN PC$="=P"+LEFT$(L$,CVI(G$)) ELSE PC$=""
6260 CLS:LOCATE 1,1,1:PRINT"===DIALING ";N$
6265 DIAL$=RIGHT$(R$,CVI(X$))
6270 IF SERV1 THEN DIAL$=SERV1$+DIAL$
6275 IF SERV2 THEN DIAL$=SERV2$+DIAL$
6280 PRINT#1, MODM$+DIAL$:STRT$=TIME$
6285 CLOSE#2:GOSUB 2700:GOSUB 2800:GOTO 515
6300 ' -- Manual Dialing
6305 MDFLG=0:LOCATE 7,1:PRINT"Current Comm Parameters are: ";COMM$:PRINT: PRINT "Options: 1) Use Current 2) Use Default 3) Change (1/2/3 cr=Current) ";
6306 B$=INKEY$:IF B$="" GOTO 6306 ELSE IF VAL(B$)<>1 AND VAL(B$)<>2 AND VAL(B$)<>3 AND B$<>CHR$(13) THEN GOSUB 50500:GOTO 6306 ELSE PRINT B$
6307 IF VAL(B$)=1 OR B$=CHR$(13) THEN GOSUB 5820:MCOM$=COMM$:GOTO 6308 ELSE IF VAL(B$)=2 THEN GOSUB 5820:MCOM$=DCOMM$:GOTO 6308 ELSE MDFLG=-1:GOSUB 5010: MDFLG=0:MCOM$=COMM$:GOSUB 5820
7460 FOR I=16 TO 23:LOCATE I,1:PRINT SPACE$(80);:NEXT:LOCATE 24,1:PRINT SPACE$(79);:LOCATE ,,1:RETURN
7465 '
8000 ' ***** REDIAL -- by Jim Gainsley, Mpls MN, March 1984 (612)338-6124
8005 '
8010 COMA=0:Q1DELAY=QDELAY 'COMA--To recognize pauses if used in DIAL$
8015 FOR I=1 TO LEN(DIAL$):IF MID$(DIAL$,I,1)="," THEN COMA=COMA+38
8020 NEXT:IX=0:CLS:V$=TIME$:LOCATE 20,4,0:PRINT"To change disconnect delay time press ";:COLOR HI,BG:PRINT"]";:COLOR FG,BG:PRINT" after '**REDIALING:' appears above.";:LOCATE 1,1
8025 MSG$=" Redialing... *** HIT R TO RECYCLE. HIT SPACE BAR TO TERMINATE ***" :GOSUB 2600:LOCATE 2,54:PRINT"Redial Started at: ";:COLOR HI,BG:PRINT V$;: COLOR FG,BG:LOCATE 1,1
8030 Q1$="":Q$="":PRINT" ===REDIALING ";N$;:LOCATE 1,45:PRINT "Time at Start of This Pass: ";:COLOR HI,BG:PRINT TIME$:COLOR FG,BG: LOCATE 2,1:PRINT#1,MODM$+DIAL$:ROW=CSRLIN:COL=POS(0)
8045 LOCATE 22,4:PRINT"THIS IS TRY #: ";IX;" ELAPSED TIME THIS PASS ";I;
8050 B1$=INKEY$:IF B1$="R" OR B1$="r" GOTO 8115
8055 IF B1$="]" GOTO 8165
8060 '
8065 IF B1$=" " GOTO 8155
8070 IF LOC(1)>0 THEN Q$=INPUT$(LOC(1),1):Q1$=Q1$+Q$ ELSE 8080 'See Ln 9055
8075 IF INSTR(Q1$,MODM$+DIAL$)<>0 AND AFLG=0 THEN LOCATE ROW,COL:PRINT " ** DIALING: ";MODM$+DIAL$:PRINT" ** COM PARAMS: ";MID$(COMM$,6,10):PRINT" ** DISCONNECT DELAY PERIOD IS: "Q1DELAY:AFLG=1:ROW=CSRLIN:COL=POS(0)
8080 I=I+1
8085 IF INSTR(Q1$,CONNECT$)<>0 GOTO 8130
8090 IF INSTR(Q1$,"BUSY")<>0 OR INSTR(Q1$,"NO CARRIER")<>0 GOTO 8125
8095 SOUND SD,18.5 'Provides elapsed time since dial completed
8100 WEND
8105 ' -- Delay Time has Expired
8110 LOCATE ROW,COL:COLOR HI,BG:PRINT" ** DELAY PERIOD EXPIRED **";:COLOR 7,BG
8115 PRINT#1,"A":SOUND SD,30:GOSUB 8180:CLOSE#1:OPEN COMM$ AS #1: GOTO 8025
8120 ' -- Busy or No Carrier
8125 LOCATE ROW,COL:COLOR HI,BG:PRINT" *** LINE BUSY OR NO CARRIER ***": COLOR FG,BG:SOUND SD,26:GOSUB 8180:GOTO 8025
8130 ' -- Connected
8135 STRT$=TIME$:MSG$=" REMOTE COMPUTER ON LINE *** HIT ANY KEY TO PROCEED ***" :GOSUB 2600
8140 LOCATE 12,15:COLOR 31,BG:PRINT" <<< CONNECTED WITH "N$" >>>": COLOR FG,BG:LOCATE ,,1
8145 IF SILENT THEN WHILE INKEY$="":SOUND 12000,1:SOUND SD,25:WEND:CLS:GOSUB 2800:GOTO 515
8146 WHILE INKEY$="":SOUND 3560,4:SOUND 3940,4:WEND:CLS:GOSUB 2800:GOTO 515
8165 LOCATE 13,1:INPUT"GIVE NEW DELAY IN SECONDS (10 sec. minimum cr=default)"; Q1DELAY
8170 IF Q1DELAY=0 THEN Q1DELAY=QDELAY ELSE IF Q1DELAY<10 THEN Q1DELAY=10
8175 LOCATE 13,1:PRINT SPACE$(78);:GOTO 8070
8180 LOCATE 2,1:FOR I=1 TO 4:PRINT SPACE$(40):NEXT:LOCATE 1,1:RETURN
8199 '
8200 ' ***** ELAPSED TIME *****
8205 '
8210 IF STRT$="--" THEN MLPSD=0:GOTO 8220
8215 MSTRT=VAL(MID$(STRT$,1,2))*60+VAL(MID$(STRT$,4,2)):MSTOP=VAL(MID$(TIME$,1,2))*60+VAL(MID$(TIME$,4,2)):MLPSD=INT(MSTOP-MSTRT):IF MSTRT>MSTOP THEN MLPSD=MLPSD+1440
8910 GOSUB 50500:PRINT:PRINT"*** This program requires that you have a serial port."
8915 PRINT:PRINT:PRINT"(returning to DOS)":PRINT #1,"ATZ":COLOR 7,0,0:CLS:SYSTEM
8920 '
8925 COLOR HI,BG:PRINT"<<";MSG$;">>";:COLOR FG,BG:RETURN
8930 IF ERR=52 OR ERR=64 OR ERR=67 THEN MSG$="Not a valid file name.
8935 IF ERR=53 THEN MSG$="File not found.
8940 IF ERR=70 THEN MSG$="Disk is write protected.
8945 IF ERR=71 THEN MSG$="Check disk drive.
8950 IF ERR=72 THEN MSG$="Disk media error.
8955 RETURN
8960 '
9000 ' ********* E R R O R T R A P S **********
9001 '
9002 IF ERL=3132 AND ERR=71 THEN PRINT"DISK NOT READY!":RESUME 3145
9003 IF ERL=3132 OR ERL=3110 THEN RESUME 3135
9010 IF ERL=215 THEN RESUME 5405
9015 IF ERL=225 THEN RESUME 245
9020 IF ERL=5665 THEN RESUME 5670
9025 IF ERL=425 THEN RESUME 245
9030 IF ERR=27 THEN GOSUB 50500:MGS$="CHECK PRINTER":GOSUB 8925:PR=0:IF ERL=1610 THEN RESUME 515 ELSE RESUME 820
9035 IF ERL=5280 THEN GOSUB 50500:GOSUB 5295:PRINT TAB(31) "*** Invalid communications parameters. Try again.";:EXIT=0:RESUME 5215
9040 IF ERL=6215 AND ERR=64 THEN GOSUB 50500:LOCATE 20,1:PRINT"*** Invalid parameters for entry #";Q$:RESUME 6400
9045 IF ERL=6245 THEN GOSUB 50500:LOCATE 20,1:PRINT"*** Invalid stripping for entry #";Q$:RESUME 6400
9050 IF ERR=24 THEN MSG$="TIMEOUT":GOSUB 8925:IF PR THEN PR=0:MSG$="PRINTOUT OFF":GOSUB 8925:PR=O:CLOSE#3:RESUME 820 ELSE MSG$="CHECK MODEM":GOSUB 8925:RESUME 515
9055 IF ERR=57 THEN MSG$="":GOSUB 8925:IF RC$="X" THEN RESUME 4525 ELSE IF TC$="X" THEN RESUME 4725 ELSE IF ERL=8070 THEN RESUME 8075 ELSE RESUME 515
9060 IF ERR=69 THEN PRINT#1,XF$;:PSE=-1:MSG$="OVERFLOW":GOSUB 8925:IF NOT PR THEN RESUME 515 ELSE MSG$="PRINTOUT OFF":PR=0:CLOSE#3:RESUME 515
9065 IF ERR=15 AND ERL=660 THEN MSG$="OVERFLOW--PRINTOUT OFF":GOSUB 8925:PR=0:CLOSE#3:RESUME 515
9070 IF ERL=3640 THEN GOSUB 50500:PRINT"*** File(s) not found. Try again.":RESUME 3645
9075 IF ERR=61 AND RC$="X" THEN GOSUB 50500:PRINT"*** DISK IS FULL":RESUME 4645
9080 IF ERR=61 THEN GOSUB 50500:PRINT:PRINT"===DISK IS FULL===":IF RC THEN RESUME 3000 ELSE RESUME 3820
9085 IF ERL=3810 THEN LOCATE 1,40:COLOR HI,BG:PRINT"***CAN'T OPEN ";DUMP$;"***";:LOCATE ROW,COL:RESUME 3820
9090 IF ERR=67 AND ERL=3595 THEN PRINT"*** Either too many files, or
9095 IF ERL=3595 THEN MSG$="":GOSUB 8930:GOSUB 50500:PRINT"*** ";MSG$;" Try again.":RESUME 3500
9100 IF ERR=67 OR ERR=70 OR ERR=71 THEN GOSUB 50500:PRINT"*** Can't read/write file in the default drive.":PRINT"Correct and hit any key to resume..":Q$=INPUT$(1):IF ERL<400 THEN RESUME 215 ELSE CLS:RESUME 400
9105 IF ERR=68 THEN GOTO 8910
9115 IF ERR=62 AND ERL=3420 THEN RESUME 3425
9120 IF ERR=53 AND ERL=11137 THEN GOSUB 50500:PRINT "===File NOT FOUND===": RESUME 11130
9125 IF ERR=53 AND ERL=11167 THEN GOSUB 50500:PRINT "===File NOT FOUND===": RESUME 11160
9900 ' -- If Not Trapped
9905 GOSUB 50500:MSG$=" Sorry, NON-RECOVERABLE ERROR "+STR$(ERR)+" at line"+ STR$(ERL): GOSUB 2600:IF NOT ERR=5 THEN CLOSE:ON ERROR GOTO 0 ELSE ON ERROR GOTO 0
9946 '
9999 DATA 830326
10000 '
10001 ' ***** SPLIT-SCREEN OPERATION -- By Wes Meier *****
10002 '
10003 IF SP THEN SP=0:TMP$="":LOCATE ROW,COL,1:PRINT:PRINT ELSE 10010
10901 ' NOTE: Lines 11000 thru 11022 changed to give multiple entries, using the carriage return substitute, on splitscreen -Dennis Cheves-(904)376-0718
10902 '
10997 '
10998 'Line 530 modified for proper operation of backspace with both echo and splitscreen. Lines 11000 thru 11040 changed to allow the CR substitute to be used with splitscreen to provide multiple entries. --Dennis Cheves-- (904) 376-0718
10999 '
11000 IF B$=CR$ THEN RETPOS=INSTR(TMP$,XCR$):IF RETPOS=0 THEN LOCATE 25,1,0:PRINT CLIN$;:B$=TMP$:TMP$="":GOTO 11010:ELSE IF LEN(TMP$)>1 THEN GOTO 11005 ELSE TMP$="":XPOS=1:LOCATE 25,XPOS,1:GOTO 560:ELSE GOTO 11020